#include "libPFS.h"

#define fsInfo 75
#define fInfo 76
#define salirOk 79

void ejecutarConsola() {
	char teclado[TAMSECTOR];
	while (1) {
		interfazConsola();
		fgets(teclado, TAMSECTOR, stdin);
		procesarConsola(teclado);
	}
}

void interfazConsola() {

	printf("####################################\n");
	printf("###### Funciones De La Consola #####\n");
	printf("####################################\n");
	printf("                                    \n");
	printf("1 - fsInfo                          \n");
	printf("2 - fInfo pathDeUnArchivo           \n");
	printf("                                    \n");
	printf("                                    \n");
	printf("####################################\n");

}

void procesaFsInfo() {
	extern stBootSector sectorBoot;
	int32_t cantBytes = 4;
	int32_t tamFat = (TAMSECTOR * sectorBoot.BPB_FATSz32);
	int32_t cantClusters = TAMSECTOR / cantBytes * sectorBoot.BPB_FATSz32;
	int32_t clustersLibres = recorroBitVector(cantClusters);
	int32_t clustersOcupados = cantClusters - clustersLibres;
	printf("                                     \n");
	printf("Cantidad De Clusters Ocupados:%d     \n", clustersOcupados);
	printf("Cantidad De Clusters Libres:%d       \n", clustersLibres);
	printf("El Tamanio de Un Sector Es:%d Bytes  \n", TAMSECTOR);
	printf("El Tamanio de Un Cluster Es:%d Bytes \n",
			sectorBoot.BPB_SecPerClus * TAMSECTOR);
	printf("El Tamanio de la FAT Es:%d KBytes    \n", tamFat / 1024);
	printf("Presione Enter para Continuar...     \n");
	getchar();

}

void procesaFInfo(char *pathArchivo) {

    extern stFatConMutex stFatMutex;
    uint32_t clusterInicial;
    int8_t cantMax = 1;
    uint32_t offsetDir, clusterDirectorio;
    stDirectoryConNombreLargo entradaDir;
    clusterInicial = leerSubDirectorios(pathArchivo, &offsetDir, &entradaDir,
                      &clusterDirectorio);
	if (clusterInicial == FINARCHIVO)
	{
		printf(" %s No Existe\n", pathArchivo);
		printf("                                    \n");
		return;
	}
	if (clusterInicial == 0)
	  printf("Archivo Vacio, No tiene Clusters Asociados\n");
	else
	  {
		if (stFatMutex.fatRegion[clusterInicial] == FINARCHIVO)
			printf("[%d", clusterInicial);
		else
			printf("[%d,", clusterInicial);
	while (stFatMutex.fatRegion[clusterInicial] != FINARCHIVO && cantMax < 20)
	{
		clusterInicial = stFatMutex.fatRegion[clusterInicial];
		if (stFatMutex.fatRegion[clusterInicial] == FINARCHIVO || cantMax == 19)
			printf("%d", clusterInicial);
		else
			printf("%d,", clusterInicial);
		cantMax++;
	}
	printf("]\n");
	  }
	printf("\n");
	printf("\n");
	printf("Presione Enter para Continuar...     \n");
	getchar();
}

int32_t obtenerNumeroDeOperacion(char *data) {
	char tokenfsInfo[] = "fsInfo";
	char tokenfInfo[] = "fInfo";
	char salir[] = "exit";
	if (strcmp(data, tokenfsInfo) == 0)
		return fsInfo;
	if (strcmp(data, tokenfInfo) == 0)
		return fInfo;
	if (strcmp(data, salir) == 0)
		return salirOk;
	return 0;
}

void procesarConsola(char *data) {
	int32_t parseo;
	char tokenfsInfo[] = "fsInfo";
	char tokenfInfo[] = "fInfo";
	char *cadenaABuscar;
	char *aux = (char *) calloc(sizeof(char), strlen(data) + 1);
	if (strcmp(data, "\n") == 0)
		return;
	parseo = parsearData(data, "\n", tokenfsInfo, &cadenaABuscar);
	memcpy(aux, data, strlen(data));
	if (strchr(aux, ' ') != NULL) {
		parseo = parsearData(aux, " ", tokenfInfo, &cadenaABuscar);
		parseo = obtenerNumeroDeOperacion(aux);
	}
	parseo = obtenerNumeroDeOperacion(aux);
	free(aux);
	switch (parseo) {
	case fsInfo:
		procesaFsInfo();

		break;
	case fInfo:
		parseo = parsearData(data, " ", tokenfInfo, &cadenaABuscar);

		parseo = strcmp(data,cadenaABuscar);

		if (parseo == 0)
		   printf("Ingresar path del archivo a buscar\n");
		 else
		  {
                  printf("%s                             		\n", cadenaABuscar);
                  printf("                                    \n");
                  printf("#Clusters:                          \n");
                  printf("                                    \n");
                  procesaFInfo(cadenaABuscar);
                  liberarMemoria(&cadenaABuscar);
		  }
		break;
	case salirOk:
		printf("Cerrando PFS... Gracias Vuelva Pronto\n");

		exit(0);
		break;
	default:
		printf("Ingreso Un Comando Erroneo...\n");
		break;
	}

}
